package jeuDeLaVie;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Random;

public class Cellule implements Serializable{

        /**
         * 
         */
        private static final long serialVersionUID = -2244475183836184429L;
        int etatCourant;
        int etatPrecedent;
        ArrayList<Cellule> voisins;
        
        public Cellule() {
                etatCourant = 0;
                etatPrecedent = 0;
                
        }
        
        public void setVoisins(ArrayList<Cellule> tampon){
                voisins = tampon;
        }

        public int getEtatCourant() {
                return etatCourant;
        }

        public void saveEtatCellule(){
                // copie l'état courant dans l'état précédent
                this.etatPrecedent = this.etatCourant;
        }
        
        public void updateEtatCellule1(){
                //calcul de son nouvel état courant, à partir des états précédents de ses voisins
        		int nbActive = 0;
        		for(int i = 0;i < this.voisins.size();i++)
        		{
        			//test different si on a plusieur type de cellule possibilite de faire plusieur type de nbActive pour chaque type de cellule
        			if(this.voisins.get(i).etatPrecedent == 1)
        			{
        				nbActive++;
        			}
        		}
        		switch (nbActive) {
                case 0:  this.etatCourant = 0;      break;
                case 1:  this.etatCourant = 0;      break;
                case 2:  					     	break;
                case 3:  this.etatCourant = 1;      break;
                case 4:  this.etatCourant = 0;      break;
                default: this.etatCourant = 0; 		break;
            }

        }
        
        

        
        public void updateEtatCellules(){
            //calcul de son nouvel état courant, à partir des états précédents de ses voisins
    		int nbActive1 = 0;
    		int nbActive2 = 0;
    		int nbActive3 = 0;
    		int nbActive4 = 0;
    		
    		for(int i = 0;i < this.voisins.size();i++)
    		{
    			//test different si on a plusieur type de cellule possibilite de faire plusieur type de nbActive pour chaque type de cellule
               	switch (this.voisins.get(i).etatPrecedent) {
                case 1:  nbActive1++;   break;
                case 2:  nbActive2++;   break;
                case 3:  nbActive3++;	break;
                case 4:  nbActive4++;   break;
                default: 	 break;
            }
    		}
    		switch (nbActive1) {
            case 0:  this.etatCourant = 0;      break;
            case 1:  this.etatCourant = 0;      break;
            case 2:  this.etatCourant = 0;	 	break;
            case 3:  this.etatCourant = 1;      break;
            case 4:  this.etatCourant = 2;      break;
            case 5:  this.etatCourant = 3;      break;
            case 6:  this.etatCourant = 4;      break;
            case 7:  this.etatCourant = 0;      break;
            case 8:  this.etatCourant = 0;      break;
            default: this.etatCourant = 0; 		break;
        }
    		switch (nbActive2) {
            case 0:        break;
            case 1:        break;
            case 2:  this.etatCourant = 1;	 	break;
            case 3:  this.etatCourant = 2;      break;
            case 4:  this.etatCourant = 3;      break;
            case 5:  this.etatCourant = 4;      break;
            case 6:  this.etatCourant = 0;      break;
            case 7:  this.etatCourant = 0;      break;
            case 8:  this.etatCourant = 0;      break;
            default: this.etatCourant = 0; 		break;
        }
    		switch (nbActive3) {
            case 0:        break;
            case 1:  this.etatCourant = 1;      break;
            case 2:  this.etatCourant = 2;	 	break;
            case 3:  this.etatCourant = 3;      break;
            case 4:  this.etatCourant = 4;      break;
            case 5:  this.etatCourant = 0;      break;
            case 6:  this.etatCourant = 0;      break;
            case 7:  this.etatCourant = 0;      break;
            case 8:  this.etatCourant = 0;      break;
            default: this.etatCourant = 0; 		break;
        }
    		

    }
        
        
        public void updateEtatCellulee(Environnement monde){
    		int nbActive1 = 0;
    		int nbActive2 = 0;
    		int nbActive3 = 0;
    		int nbActive4 = 0;
    		
    		if(this.etatCourant == 5 || this.etatCourant == 6 || this.etatCourant == 7 || this.etatCourant == 8){
               	switch (this.etatCourant) {
                case 4:      		for(int i = 0;i < this.voisins.size();i++)
        		{
        			this.voisins.get(i).etatCourant = 1;
        		};   break;
                case 5:      		for(int i = 0;i < this.voisins.size();i++)
        		{
                	this.voisins.get(i).etatCourant = 2;
        		};   break;
                case 6:      		for(int i = 0;i < this.voisins.size();i++)
        		{
                	this.voisins.get(i).etatCourant = 3;
        		};	break;
                case 7:      		for(int i = 0;i < this.voisins.size();i++)
        		{
                	this.voisins.get(i).etatCourant = 4;
        		};   break;
                default: 	 break;
            }	
    		}
    		
    		
    		
    		
    		
    		else{
    		for(int i = 0;i < this.voisins.size();i++)
    		{
    			//test different si on a plusieur type de cellule possibilite de faire plusieur type de nbActive pour chaque type de cellule
               	switch (this.voisins.get(i).etatPrecedent) {
                case 1:  nbActive1++;   break;
                case 2:  nbActive2++;   break;
                case 3:  nbActive3++;	break;
                case 4:  nbActive4++;   break;
                default: 	 break;
            }
    		}
    		switch (nbActive1) {
            case 0:  this.etatCourant = 0;      break;
            case 1:  this.etatCourant = 0;      break;
            case 2:  this.etatCourant = 0;	 	break;
            case 3:  this.etatCourant = 1;      break;
            case 4:  this.etatCourant = 2;      break;
            case 5:  this.etatCourant = 3;      break;
            case 6:  this.etatCourant = 4;      break;
            case 7:  this.etatCourant = 0; monde.SetRessource1(monde.getRessource1()+1);     break;
            case 8:  this.etatCourant = 0; monde.SetRessource2(monde.getRessource1()+2);     break;
            default: this.etatCourant = 0; monde.SetRessource3(monde.getRessource1()+3);	 break;
        }
    		switch (nbActive2) {
            case 0:        break;
            case 1:        break;
            case 2:  this.etatCourant = 1;	 	break;
            case 3:  this.etatCourant = 2;      break;
            case 4:  this.etatCourant = 3;      break;
            case 5:  this.etatCourant = 4;      break;
            case 6:  this.etatCourant = 0; monde.SetRessource1(monde.getRessource1()+1);     break;
            case 7:  this.etatCourant = 0; monde.SetRessource2(monde.getRessource2()+1);     break;
            case 8:  this.etatCourant = 0; monde.SetRessource3(monde.getRessource3()+1);     break;
            default: this.etatCourant = 0; monde.SetRessource4(monde.getRessource4()+1);	 break;
        }
    		switch (nbActive3) {
            case 0:        break;
            case 1:  this.etatCourant = 1;      break;
            case 2:  this.etatCourant = 2;	 	break;
            case 3:  this.etatCourant = 3;      break;
            case 4:  this.etatCourant = 4;      break;
            case 5:  this.etatCourant = 0; monde.SetRessource1(monde.getRessource1()+1);     break;
            case 6:  this.etatCourant = 0; monde.SetRessource2(monde.getRessource2()+1);     break;
            case 7:  this.etatCourant = 0; monde.SetRessource3(monde.getRessource3()+1);     break;
            case 8:  this.etatCourant = 0; monde.SetRessource4(monde.getRessource4()+1);     break;
            default: this.etatCourant = 0; monde.SetRessource1(monde.getRessource1()+1);		
            							   monde.SetRessource2(monde.getRessource2()+1);
            							   monde.SetRessource3(monde.getRessource3()+1);
            							   monde.SetRessource4(monde.getRessource4()+1);                       
            							   break;
        }
    	}
    }
        
        
        public void updateEtatCellulef(){

            this.etatCourant = 0;


    }
        
        public void naissance1(){
        	Random rn = new Random();
        	int val = rn.nextInt(6);
        	
        	switch (val) {
            case 0:  this.etatCourant = 0;      break;
            case 1:  this.etatCourant = 1;      break;
            case 2:  this.etatCourant = 0;	 	break;
            case 3:  this.etatCourant = 0;      break;
            case 4:  this.etatCourant = 0;      break;
            case 5:  this.etatCourant = 0;      break;
            default: this.etatCourant = 0; 		break;
        }
        }
        

        
        public void naissances(){
        	Random rn = new Random();
        	int val = rn.nextInt(6);
        	
        	switch (val) {
            case 0:  this.etatCourant = 0;      break;
            case 1:  this.etatCourant = 1;      break;
            case 2:  this.etatCourant = 2;	 	break;
            case 3:  this.etatCourant = 3;      break;
            case 4:  this.etatCourant = 4;      break;
            case 5:  this.etatCourant = 0;      break;
            default: this.etatCourant = 0; 		break;
        }
        }


        public void naissancev(Environnement monde){
        	
        	
        	if(this.etatCourant < 5){
        	Random rn = new Random();
        	int val = rn.nextInt(40);
        	
        	switch (val) {
            case 0:  if(monde.getRessource1() > 0){this.etatCourant = 5;
            monde.SetRessource1(monde.getRessource1()-9);}      break;
            case 1:  if(monde.getRessource2() > 0){this.etatCourant = 6;
            monde.SetRessource2(monde.getRessource2()-9);}      break;
            case 2:  if(monde.getRessource3() > 0){this.etatCourant = 7;
            monde.SetRessource3(monde.getRessource3()-9);} 	 	break;
            case 3:  if(monde.getRessource4() > 0){this.etatCourant = 8;
            monde.SetRessource4(monde.getRessource4()-9);}       break;
            default: this.etatCourant = 0; 		break;
        		}
        	}
        }
       
        
		public void cree(){
        	switch (this.etatCourant) {
            case 0:  this.etatCourant = 1;   break;
            case 1:  this.etatCourant = 2;   break;
            case 2:  this.etatCourant = 3;	 break;
            case 3:  this.etatCourant = 4;   break;
            case 4:  this.etatCourant = 0;   break;
            default: this.etatCourant = 0; 	 break;
        		}
		}
		
		public void preCree(){
			
		}
        

}



